package com.itheima.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.constant.MessageConstant;
import com.itheima.dao.UserDao;
import com.itheima.entity.PageResult;
import com.itheima.pojo.Role;
import com.itheima.pojo.User;
import com.itheima.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 用户服务接口实现类
 */
@Service(interfaceClass = UserService.class)
@Transactional
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;

    /**
     * 根据用户查询用户对象
     * @param username
     * @return
     */
    @Override
    public User findUserByUsername(String username) {
        return userDao.findUserByUsername(username);
    }

    /**
     * 用户分页查询
     */
    @Override
    public PageResult findPage(Integer currentPage, Integer pageSize, String queryString) {
        //第一步：设置分页参数
        PageHelper.startPage(currentPage,pageSize);
        //第二步：查询数据库（代码一定要紧跟设置分页代码  没有手动分页 select * from table where name = 'xx'  ）
        Page<User> page = userDao.selectByCondition(queryString);
        //从分页插件中获取        total总记录数  和  rows当前页结果
        return new PageResult(page.getTotal(),page.getResult());
    }

    /**
     * 查询所有角色
     */
    @Override
    public List<Role> findAll() {
        return userDao.findAll();

    }

    /**
     * 新增用户
     */
    @Override
    public void add(User user, Integer[] roleIds) {

        //第一步：保存用户表
        userDao.add(user);
        //第二步：获取用户id
        Integer userId = user.getId();
        //第三步：往用户_角色中间表 遍历插入关系数据
        setRoleAndUser(userId,roleIds);
    }

    /**
     * 根据用户id删除用户信息
     */
    @Override
    public void deleteById(Integer id) {
            //1.根据用户id查询用户与角色中间表（count(*)）
            int count = userDao.findCountUserRoleByUserId(id);
            if(count>0){
                throw new RuntimeException(MessageConstant.DELETE_USER_FAIL2);
            }
            //2.根据用户id删除用户信息
            userDao.deleteById(id);
        }

    /**
     *根据用户id查询用户信息
     */
    @Override
    public User findById(Integer userId) {
        return userDao.findById(userId) ;
    }

    /**
     * 根据用户id 查询角色ids
     */
    @Override
    public List<Integer> findRoleIdsByUserId(Integer userId) {
        List<Integer> roleIdsByUserId = userDao.findRoleIdsByUserId(userId);
        return roleIdsByUserId;
    }

    /**
     * 编辑用户
     */
    @Override
    public void edit(User user, Integer[] roleIds) {
            //1.先根据用户id从用户_角色中间表 删除关系数据
            userDao.deleteUserRoleByUserId(user.getId());
            //2.根据页面传入的角色ids 和 用户重新建立关系
             setRoleAndUser(user.getId(),roleIds);
            //3根据用户id 更新用户数据
            userDao.edit(user);
    }

    /**
     * 密码修改
     */
    @Override
    public void upPassword(Integer id, String password2) {
        userDao.upPassword(id, password2);
    }

    /**
     * 查询所有的用户
     */
    @Override
    public List<User> findUsers() {
        return userDao.findUsers();
    }


    /**
     * 设置用户和角色中间表
     */
    private void setRoleAndUser(Integer userId, Integer[] roleIds) {
        if(roleIds != null && roleIds.length>0){
            for (Integer roleId : roleIds) {
                Map<String,Object> map = new HashMap<>();
                map.put("roleId",roleId);
                map.put("userId",userId);
                userDao.setRoleAndUser(map);
            }
        }
    }
}

